package com.dream.myqiyi.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;

import com.dream.myqiyi.dao.NoteTagsModel;
import com.dream.myqiyi.dao.TagModel;

public class TagService {
	Map<String, TagModel>			allTags = null;
	boolean							isDirty = true;
	TagModel						currTagModel = null;
	TagManager						tagMgr = null;
	NoteTagsManager					noteTagMgr = null;

	public TagService() {
		allTags = new HashMap<String, TagModel>();
		tagMgr = (TagManager)ApplicationContext.getSingleton().getBean("TagManager");
		isDirty = true;
		noteTagMgr = (NoteTagsManager)ApplicationContext.getSingleton().getBean("NoteTagsManager");
	}
	
	public TagModel getCurrTag() {
		return currTagModel;
	}
	
	public void setCurrTag(TagModel note) {
		currTagModel = note;
	}
	
	public TagModel getTag(String guid) {
		if (isDirty) {
			updateAllTags();
		}
		return allTags.get(guid);
	}
	
	public TagModel getTagByName(String name) {
		if (isDirty) {
			updateAllTags();
		}
		
		for (Map.Entry<String, TagModel> entry : allTags.entrySet()) {
			TagModel tag = entry.getValue();
			if (name == tag.getName()) {
				return tag;
			}
		}
		return null;
	}
	
	public List<TagModel> getNoteTags(String noteGuid) {
		List<TagModel> ret = new ArrayList<TagModel>();
		if (isDirty) {
			updateAllTags();
		}
		
		List<NoteTagsModel> noteTags = noteTagMgr.findByNoteGuid(noteGuid);
		for (NoteTagsModel nt : noteTags) {
			TagModel tag = getTag(nt.getTagGuid());
			if (tag != null) {
				ret.add(tag);
			}
		}
		return ret;
	}
	
	public boolean hasNoteTag(String noteGuid, String tagGuid) {
		boolean ret = false;
		if (isDirty) {
			updateAllTags();
		}
		
		List<NoteTagsModel> noteTags = noteTagMgr.findByNoteGuid(noteGuid);
		for (NoteTagsModel nt : noteTags) {
			if (tagGuid.equals(nt.getTagGuid())) {
				ret = true;
				break;
			}
		}
		return ret;		
	}
	
	public void addNoteTag(String noteGuid, String tagGuid) {
		if (!hasNoteTag(noteGuid, tagGuid)) {
			NoteTagsModel nt = new NoteTagsModel();
			nt.setNoteGuid(noteGuid);
			nt.setTagGuid(tagGuid);
			noteTagMgr.save(nt);
		}
	}
	
	public void removeNoteTag(String noteGuid, String tagGuid) {
		if (isDirty) {
			updateAllTags();
		}
		
		List<NoteTagsModel> noteTags = noteTagMgr.findByNoteGuid(noteGuid);
		for (NoteTagsModel nt : noteTags) {
			if (tagGuid.equals(nt.getTagGuid())) {
				noteTagMgr.remove(nt.id);
				break;
			}
		}		
	}

	public void saveNoteTags(String noteGuid, List<TagModel> tags) {
		noteTagMgr.removeByNoteGuid(noteGuid);
		for (TagModel t : tags) {
			NoteTagsModel nt = new NoteTagsModel();
			nt.setNoteGuid(noteGuid);
			nt.setTagGuid(t.getGuid());
			noteTagMgr.save(nt);
		}
	}
	
	public void updateAllTags() {
		isDirty = false;
		allTags.clear();
		List<TagModel> tagList = tagMgr.getAll();
		for (TagModel tag : tagList) {
			allTags.put(tag.getGuid(), tag);
		}
	}
	
	public ArrayList<TagModel> getAllTags() {
		if (isDirty) {
			updateAllTags();
		}
		
		return new ArrayList<TagModel>(allTags.values());
	}

	public int getAllTagCount() {
		if (isDirty) {
			updateAllTags();
		}
		return allTags.size();
	}
	
	public TagModel addTag(String name) {
		if (isDirty) {
			updateAllTags();
		}
		TagModel ret = null;
		Iterator<Entry<String, TagModel>> it = allTags.entrySet().iterator();
		while (it.hasNext()) {
			if (it.next().getValue().getName().equals(name)) {
				ret = it.next().getValue();
				break;
			}
		}
		if (ret == null) {
			ret = new TagModel();
			ret.guid = UUID.randomUUID().toString();
			ret.name = name;
			tagMgr.save(ret);
	
			allTags.put(ret.getGuid(), ret);
			
		}
		
		return ret;
	}
	
	public void delTag(String guid) {
		List<NoteTagsModel> noteTags = noteTagMgr.findByTagGuid(guid);
		for (NoteTagsModel nt : noteTags) {
			noteTagMgr.remove(nt.id);
		}
		tagMgr.remove(guid);
		allTags.remove(guid);
	}

}
